#include "blockQueue.hpp"
#include"task.hpp"
#include <ctime>
#include <unistd.h>

using namespace std;

// 消费者生产者启动函数
void *consumer(void *args)
{
    blockQueue<Task> *bq = static_cast<blockQueue<Task> *>(args);
    
    while(true)
    {
        sleep(1);
        Task t;
        bq->pop(&t);
        t();
        cout<<"消费者获取数据： "<<t.formatArg()<<t.formatRes()<<endl;
    }
}

// 生产者启动函数
void *producer(void *args)
{
    blockQueue<Task> *bq = static_cast<blockQueue<Task> *>(args);
    string cal="+-*/%";
    while (true)
    {
        sleep(1);
        //生产运算
        int x=rand()%20+1;
        int y=rand()%20+1;
        char op=cal[rand()%cal.size()];

        //构造任务
        Task t(x,y,op);
        bq->push(t);

        cout<<"生产者生产数据： "<<t.formatArg()<<"?"<<endl;
    }
}

int main()
{
    blockQueue<int> *bq=new blockQueue<int>();
    // 随机数种子
    srand((uint64_t)time(nullptr));

    // pthread_t Consumer;
    // pthread_t Producer;
    // //创建线程
    // pthread_create(&Consumer, nullptr, consumer, bq);
    // pthread_create(&Producer, nullptr, producer, bq);
    // //线程等待
    // pthread_join(Consumer,nullptr);
    // pthread_join(Producer,nullptr);

    pthread_t c[2], p[3];
    pthread_create(&c[0], nullptr, consumer, bq);
    pthread_create(&c[1], nullptr, consumer, bq);
    pthread_create(&p[0], nullptr, producer, bq);
    pthread_create(&p[1], nullptr, producer, bq);
    pthread_create(&p[2], nullptr, producer, bq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);
    delete bq;
}